import os
import pandas as pd
from email.header import decode_header
import re
def decode_mime_header(header_value):
    """
    处理混合编码的邮件头值，自动识别和解码 `=?` 部分，保留普通文本
    """
    decoded_parts = []

    # 分割字符串：查找所有 =?...?= 编码段
    parts = re.split(r'(=\?.*?\?=)', header_value)

    for part in parts:
        if part.startswith('=?') and part.endswith('?='):
            # 这是需要解码的部分
            try:
                decoded_segments = decode_header(part)
                for segment_bytes, charset in decoded_segments:
                    if charset:
                        decoded_parts.append(segment_bytes.decode(charset, errors='ignore'))
                    else:
                        # 尝试自动检测编码
                        try:
                            decoded_parts.append(segment_bytes.decode('gb2312', errors='ignore'))
                        except:
                            decoded_parts.append(segment_bytes.decode('utf-8', errors='ignore'))
            except:
                # 解码失败时保留原始文本
                decoded_parts.append(part)
        else:
            # 普通文本部分直接保留
            decoded_parts.append(part)

    return ''.join(decoded_parts)
def extract_date_from_headers(headers):
    """从邮件头信息中提取日期（当Date字段为空时使用）"""
    # 1. 尝试从 Received 头中提取日期
    received_headers = [v for k, v in headers.items() if k == 'received']
    for received in received_headers:
        # 尝试匹配常见的日期格式
        date_match = re.search(
            r';\s*([A-Za-z]{3},\s*\d{1,2}\s+[A-Za-z]{3}\s+\d{4}\s+\d{2}:\d{2}:\d{2}\s+[+-]\d{4})',
            received
        )
        if date_match:
            return date_match.group(1).strip()

def clean_email_body(body):
    """清理邮件正文：删除所有空行和每行首尾空格"""
    if not body:
        return ""

    # 步骤1：删除每行开头和结尾的空白
    lines = [line.strip() for line in body.splitlines()]

    # 步骤2：完全删除所有空行
    cleaned_lines = [line for line in lines if line]

    # 步骤3：用空格连接所有行（形成连续文本）
    return ' '.join(cleaned_lines)

def process_single_email(file_path, label):
    try:
        with open(file_path, 'r', encoding='gb2312',errors='ignore') as file:
            content = file.read()  # 读取整个文件内容
        # 搜索第一个 \n\n 的位置
        empty_line_pos = content.find('\n\n')

        if empty_line_pos == -1:
            header_content = content.splitlines(keepends=True)  # 保持分行（含换行符）
            body = ""  # 没有空行，body为空
        else:
            # 分割 head 和 body
            header_content = content[:empty_line_pos]
            body = content[empty_line_pos + 2:]  # 跳过 \n\n，保留后续内容（含换行符）
        # print(header_content)

        headers = {}
        current_key = None

        for line in header_content.splitlines():
            # 检测新头部字段（格式为 "Key: Value"）
            if ':' in line and not line.startswith((' ', '\t')):
                key, value = line.split(':', 1)
                current_key = key.strip().lower()
                headers[current_key] = value.strip()
            # 处理多行值（续行以空格开头）
            elif current_key and line.startswith((' ', '\t')):
                headers[current_key] += ' ' + line.strip()
        email_data={
            'label': label,
            'from': headers.get('from', ''),
            'subject': headers.get('subject', ''),
            'date': headers.get('date', ''),
            'to': headers.get('to', ''),
            'body': body
        }

        email_data['from']=decode_mime_header(email_data['from'])
        email_data['subject']=decode_mime_header(email_data['subject'])

        if email_data['date']=='':
            email_data['date']= extract_date_from_headers(headers)
        email_data['body']=clean_email_body(email_data['body'])
        return email_data
    except Exception as e:
        print(f"处理文件 {file_path} 时出错: {str(e)}")
        return None

def main(index_dir='/full'):
    """主处理函数"""
    # 构建index文件路径
    index_path = os.path.join(index_dir, 'index')

    # 检查index文件是否存在
    if not os.path.exists(index_path):
        raise FileNotFoundError(f"索引文件不存在: {index_path}")

    processed_data = []

    # 读取并解析index文件
    processed_count = 0
    with open(index_path, 'r', encoding='utf-8') as f:
        for line_num, line in enumerate(f, 1):
            line = line.strip()
            if not line:
                continue  # 跳过空行

            # 分割标签和相对路径（处理可能的路径空格）
            parts = line.split(' ', 1)
            if len(parts) != 2:
                print(f"第 {line_num} 行格式错误，跳过: {line}")
                continue

            label, rel_path = parts
            abs_path = os.path.normpath(os.path.join(index_dir, rel_path))

            # 检查邮件文件是否存在
            if not os.path.isfile(abs_path):
                print(f"邮件文件不存在（行 {line_num}）: {abs_path}")
                continue

            # 处理单个邮件
            email_data = process_single_email(abs_path, label)
            if email_data:
                processed_data.append(email_data)
                processed_count += 1  # 成功处理时递增计数器
                # 调试输出（显示当前处理进度）
                if processed_count%1000==0:
                    print(f"调试：当前处理进度 - 已成功处理 {processed_count} 封邮件（当前索引行号：{line_num}）")

    # 转换为DataFrame并保存结果
    if processed_data:
        df = pd.DataFrame(processed_data)
        # 调整列顺序
        df = df[['label', 'from', 'subject', 'date', 'to', 'body']]
        # 保存为CSV（带BOM头兼容Excel中文显示）
        df.to_csv('trec06c_processed.csv', index=False, encoding='utf-8-sig')
        print(f"预处理完成！共处理 {len(processed_data)} 封邮件，结果保存至 trec06c_processed.csv")
    else:
        print("没有成功处理的邮件数据")

if __name__ == "__main__":
    # 配置参数
    EMAIL_DIR = 'full'  # 替换为实际邮件目录
    main(EMAIL_DIR)